package com.itlaobing.proxy.dynamic;

import java.io.File;
import java.lang.reflect.*;
import java.util.Arrays;

public class Test2 {

    public static void main(String[] args) {

        //获得 代理目标（proxy target）
        HuaWei target = new Factory();

        Class<?> targetClass = target.getClass();
        ClassLoader loader = targetClass.getClassLoader();

        Class<?>[] interfaces = targetClass.getInterfaces();

        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                return null;
            }
        };

        //获得 代理对象（proxy object）
        Object proxy = Proxy.newProxyInstance( loader , interfaces , handler);

        Class<?> proxyClass = proxy.getClass();

        System.out.println( "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" );

        Class<?> pc = proxyClass.getSuperclass(); // 获得 动态代理类 的父类
        System.out.println( pc.getName() ); // java.lang.reflect.Proxy

        Class<?>[] inters = proxyClass.getInterfaces(); // 获得 动态代理类 所直接实现的接口
        System.out.println(Arrays.toString( inters ));

        System.out.println( "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" );

        // 获得 代理类 中的 字段
        Field[] fields = proxyClass.getDeclaredFields();
        for (Field field : fields ) {
            System.out.println(field);
        }
        System.out.println( "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" );

        // 获得 代理类 中的 构造
        Constructor<?>[] constructors = proxyClass.getDeclaredConstructors();
        for (Constructor constructor : constructors ) {
            System.out.println(constructor);
        }
        System.out.println( "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" );

        // 获得 代理类 中的 方法
        Method[] methods = proxyClass.getDeclaredMethods();
        for (Method method : methods ) {
            System.out.println(method);
        }
    }
}
